home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / qed_397 / sourcen / av.c < prev    next >
C/C++ Source or Header  |  1997-01-14  |  9KB  |  419 lines

  1. #include "global.h"
  2. #include "comm.h"
  3. #include "dd.h"
  4. #include "debug.h"
  5. #include "disk.h"
  6. #include "options.h"
  7. #include "rsc.h"
  8. #include "windows.h"
  9. #include "av.h"
  10.  
  11.  
  12. #ifdef DEBUG
  13. #undef DEBUG_AV
  14. #endif
  15.  
  16. /* exportierte Variablen *****************************************************/
  17. GLOBAL WORD    av_shell_id = -1,        /* ID des Desktops */
  18.                 av_shell_status = 0;    /* Welche AV_* kann Desktop */
  19.  
  20.  
  21. /* Hilfe-System **************************************************************/
  22.  
  23. #ifndef AC_HELP
  24. #define AC_HELP        1025
  25. #endif
  26.  
  27. /*
  28.  * Generiert aus einem Pfadnamen den GEM-Namen (max. acht Zeichen, ggf.
  29.  * mit ' ' aufgefüllt) und überprüft ihn auf ST-GUIDE.
  30. */
  31. LOCAL BOOLEAN make_name(UBYTE *longname, UBYTE *shortname, BOOLEAN must_stg)
  32. {
  33.     WORD    len, i;
  34.     UBYTE    *p;
  35.  
  36.     if (longname[0] == EOS)
  37.     {
  38.         note(1, NOHELP);
  39.         strcpy(shortname, "");
  40.         return FALSE;
  41.     }
  42.     else
  43.     {
  44.         file_name(longname, shortname, FALSE);
  45.         str_upper(shortname);
  46.         p = strrchr(shortname, '.');                /* Extension abschneiden */
  47.         *p = '\0';
  48.         len = (short) strlen(shortname);
  49.         for (i = len; i < 8; i++)
  50.             strcat(shortname, " ");
  51.         if (must_stg && (strcmp(shortname, "ST-GUIDE") != 0))
  52.         {
  53.             note(1, NOSTG);
  54.             return FALSE;
  55.         }
  56.         else
  57.             return TRUE;
  58.     }
  59. }
  60.  
  61.  
  62. /*
  63.  * Liefert die app_id des übergebenen Programmes zurück. Falls es noch
  64.  * nicht läuft, wird es mit arg gestartet.
  65. */
  66. LOCAL WORD get_id(UBYTE* name, UBYTE *path, UBYTE *arg, BOOLEAN *started)
  67. {
  68.     WORD        ret = -1;
  69.     UBYTE        *p, help[128] = "";
  70.     BOOLEAN    s = FALSE;
  71.  
  72.     if (name[0] != EOS)
  73.     {
  74.         ret = appl_find(name);
  75.         if (ret < 0)                            /* ggf. als Programm nachstarten */
  76.         {
  77.             if (arg != NULL)
  78.             {
  79.                 strcpy(help, " ");
  80.                 strcat(help, arg);
  81.                 help[0] = (UBYTE)strlen(help);
  82.             }
  83.             p = strrchr(path, '.');
  84.             if (file_exist(path) && ((strncmp(p, ".APP", 3) == 0) || (strncmp(p, ".PRG", 3) == 0) ||
  85.                                              (strncmp(p, ".app", 3) == 0) || (strncmp(p, ".prg", 3) == 0)))
  86.             {
  87.                 if (aes41)
  88.                 {
  89.                     ret = shel_write(1, 1, 1, path, help);
  90.                     s = (ret > 0);
  91.                 }
  92.                 else if (magx)
  93.                 {
  94.                     ret = shel_write(1, 1, 100, path, help);
  95.                     s = (ret > 0);
  96.                 }
  97.                 else
  98.                 {
  99.                     note(1, HELPSTART);
  100.                     ret = -1;
  101.                 }
  102.             }
  103.             else
  104.             {
  105.                 snote(1, HELPNOTF, helpprog);
  106.                 ret = - 1;
  107.             }
  108.         }
  109.     }
  110.     if (started != NULL)
  111.         *started = s;
  112.     return ret;
  113. }
  114.  
  115. LOCAL VOID send_help(WORD id, CONST UBYTE *str)
  116. {
  117.     memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  118.     msgbuff[0] = AC_HELP;
  119.     msgbuff[1] = gl_apid;
  120.     strcpy(global_str1, str);
  121.     *(UBYTE **)(msgbuff + 3) = global_str1;
  122.     send_msg(id);
  123. }
  124.  
  125. GLOBAL BOOLEAN call_help(CONST UBYTE *str)
  126. {
  127.     WORD        help_id;
  128.     FILENAME    name;
  129.  
  130.     Wake_mouse();
  131.     if (make_name(helpprog, name, FALSE))
  132.     {
  133.         help_id = get_id(name, helpprog, NULL, NULL);
  134.         if (help_id > 0)
  135.         {
  136.             send_help(help_id, str);
  137.             return TRUE;
  138.         }
  139.     }
  140.     return FALSE;
  141. }
  142.  
  143. GLOBAL BOOLEAN call_hyp(CONST UBYTE *data)
  144. {
  145.     WORD        stg_id;
  146.     UBYTE     help[256];
  147.     FILENAME name;
  148.     BOOLEAN    started;
  149.  
  150.     if (helpprog[0] == EOS)
  151.     {
  152.         note(1, NOHELP);
  153.         return FALSE;
  154.     }
  155.     Wake_mouse();
  156.     if (make_name(helpprog, name, TRUE))
  157.     {
  158.         strcpy(help, "*:\\QED.HYP ");
  159.         strcat(help, data);
  160.  
  161.         stg_id = get_id(name, helpprog, help, &started);
  162.         if (stg_id > 0 && !started)            /* nicht gestartet, da es bereits lief! */
  163.             send_vastart(stg_id, help);        /* -> also Message schicken */
  164.         return (stg_id > 0);
  165.     }
  166.     return FALSE;
  167. }
  168.  
  169.  
  170. LOCAL VOID get_my_name(UBYTE *my_name)
  171. {
  172.     UBYTE    str[12];
  173.     WORD    d, i, id;
  174.  
  175.     if ((appl_xgetinfo(4, &d, &d, &i, &d)) && (i == 1))    /* gibts appl_search? */
  176.     {
  177.         i = appl_search(0, str, &d, &id);
  178.         while (i != 0)
  179.         {
  180.             if (id == gl_apid)
  181.                 break;
  182.             i = appl_search( 1, str, &d, &id);
  183.         }
  184.     }
  185.     if (i != 0)
  186.     {
  187.         strcpy(my_name, str);
  188.         for (i = (WORD)strlen(my_name); i < 8; i++)
  189.             strcat(my_name, " ");
  190.     }
  191.     else
  192.         strcpy(my_name, "");
  193. #ifdef DEBUG_AV
  194. Debug("get_my_name()= %s.\n", my_name);
  195. #endif
  196. }
  197.  
  198. /* AV-Protokoll **************************************************************/
  199.  
  200. LOCAL UBYTE    *glob_data = NULL;
  201.  
  202. LOCAL VOID send_avprot(VOID)
  203. {
  204.     if (av_shell_id >= 0)
  205.     {
  206.         memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  207.         msgbuff[0] = AV_PROTOKOLL;
  208.         msgbuff[1] = gl_apid;
  209.         msgbuff[3] = (2|16);        /* VA_START, Quoting */
  210. /*
  211. #ifdef DEBUG
  212.         strcpy(global_str1, "QED_NEU ");
  213. #else
  214.         strcpy(global_str1, "QED     ");
  215. #endif
  216. */
  217.         get_my_name(global_str1);
  218.         *(UBYTE **) (msgbuff + 6) = global_str1;
  219.         send_msg(av_shell_id);
  220. #ifdef DEBUG_AV
  221. Debug("qed: AV_PROTOKOLL\n");
  222. #endif
  223.     }
  224. }
  225.  
  226. LOCAL VOID send_avexit(VOID)
  227. {
  228.     if ((av_shell_id >= 0) && (av_shell_status & 1024))
  229.     {
  230.         memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  231.         msgbuff[0] = AV_EXIT;
  232.         msgbuff[1] = gl_apid;
  233.         msgbuff[3] = gl_apid;
  234.         send_msg(av_shell_id);
  235. #ifdef DEBUG_AV
  236. Debug("qed: AV_EXIT\n");
  237. #endif
  238.     }
  239. }
  240.  
  241. GLOBAL BOOLEAN send_avkey(WORD ks, WORD kr)
  242. {
  243.     BOOLEAN    b = FALSE;
  244.  
  245.     if ((av_shell_id >= 0) && (av_shell_status & 1))
  246.     {
  247.         Wake_mouse();
  248.         memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  249.         msgbuff[0] = AV_SENDKEY;
  250.         msgbuff[1] = gl_apid;
  251.         msgbuff[3] = ks;
  252.         msgbuff[4] = kr;
  253.         b = send_msg(av_shell_id);
  254. #ifdef DEBUG_AV
  255. Debug("qed: AV_SENDKEY (%d,%d)\n", ks, kr);
  256. #endif
  257.     }
  258.     return b;
  259. }
  260.  
  261. GLOBAL VOID send_avwinopen(WORD handle)
  262. {
  263.     if ((av_shell_id >= 0) && (wind_cycle))    /* Fensterwechsel global */
  264.     {
  265.         memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  266.         msgbuff[0] = AV_ACCWINDOPEN;
  267.         msgbuff[1] = gl_apid;
  268.         msgbuff[3] = handle;
  269.         send_msg(av_shell_id);
  270. #ifdef DEBUG_AV
  271. Debug("qed: AV_ACCWINDOPEN (%d)\n", handle);
  272. #endif
  273.     }
  274. }
  275.  
  276. GLOBAL VOID send_avwinclose(WORD handle)
  277. {
  278.     if ((av_shell_id >= 0) && (wind_cycle))    /* Fensterwechsel global */
  279.     {
  280.         memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  281.         msgbuff[0] = AV_ACCWINDCLOSED;
  282.         msgbuff[1] = gl_apid;
  283.         msgbuff[3] = handle;
  284.         send_msg(av_shell_id);
  285. #ifdef DEBUG_AV
  286. Debug("qed: AV_ACCWINDCLOSED (%d)\n", handle);
  287. #endif
  288.     }
  289. }
  290.  
  291. GLOBAL VOID send_avdrag(WORD wh, MKINFO *mk, WORD data_type)
  292. {
  293.     if ((av_shell_id >= 0) && (av_shell_status & 512))
  294.     {
  295.         WORD    app, d;
  296.         
  297.         wind_get(wh, WF_OWNER, &app, &d, &d, &d);
  298.         memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  299.         msgbuff[0] = AV_DRAG_ON_WINDOW;
  300.         msgbuff[1] = gl_apid;
  301.         msgbuff[3] = mk->mox;
  302.         msgbuff[4] = mk->moy;
  303.         msgbuff[5] = mk->kstate;
  304.  
  305.         switch (data_type)
  306.         {
  307.             case DRAGDROP_PATH :        /* ein Name */
  308. #ifdef DEBUG_AV
  309. Debug("qed: AV_DRAG_TO_WIN single file\n");
  310. #endif
  311.                 strcpy(global_str1, drag_filename);
  312.                 *(UBYTE **) (msgbuff + 6) = global_str1;
  313.                 break;
  314.             case DRAGDROP_DATA :        /* mehrere Namen */
  315. #ifdef DEBUG_AV
  316. Debug("qed: AV_DRAG_TO_WIN multible files\n");
  317. #endif
  318.                 glob_data = malloc_global(drag_data_size + 1);
  319.                 if (glob_data != NULL)
  320.                 {
  321.                     strcpy(glob_data, drag_data);
  322.                     *(UBYTE **) (msgbuff + 6) = glob_data;
  323.                 }
  324.                 break;
  325.         }
  326.         send_msg(av_shell_id);
  327.     }
  328. }
  329.  
  330. GLOBAL VOID send_vastart(WORD id, CONST UBYTE *data)
  331. {
  332.     memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  333.     msgbuff[0] = VA_START;
  334.     msgbuff[1] = gl_apid;
  335.     strcpy(global_str1, data);
  336.     *(UBYTE **)(msgbuff + 3) = global_str1;
  337.     send_msg(id);
  338. }
  339.  
  340.  
  341. GLOBAL VOID hndl_av(WORD msg[])
  342. {
  343.     UBYTE    *str_p;
  344.  
  345.     switch (msg[0])
  346.     {
  347.         case VA_START :
  348.             if (all_iconified)
  349.                 uniconify_window(NULL, NULL);                /* aufwachen! */
  350.             str_p = *(UBYTE **)(msg + 3);
  351.             if (str_p != NULL)
  352.             {
  353.                 PATH    va_arg;
  354.  
  355.                 strcpy(va_arg, str_p);
  356.                 if (strlen(va_arg) > 0)
  357.                 {
  358. #ifdef DEBUG_AV
  359. Debug("qed: va_arg= %s\n", va_arg);
  360. #endif
  361.                     add_diskinfo(va_arg, FALSE);
  362.                     open_multidisk();
  363.                 }
  364.             }
  365.             break;
  366.         case VA_PROTOSTATUS :
  367. #ifdef DEBUG_AV
  368. Debug("qed: VA_PROTSTATUS %u\n", av_shell_status);
  369. #endif
  370.             av_shell_status = msg[3];
  371.             if (wind_cycle && !(av_shell_status & 64))
  372.                 wind_cycle = FALSE;            /* glob. Fensterwechsel abschalten */
  373.             break;
  374.         case VA_DRAG_COMPLETE :
  375. #ifdef DEBUG_AV
  376. Debug("qed: VA_DRAG_COMPLETE.\n");
  377. #endif
  378.             if (glob_data != NULL)
  379.             {
  380.                 Mfree(glob_data);
  381.                 glob_data = NULL;
  382.             }
  383.             break;
  384.         default:
  385.             break;
  386.     }
  387. }
  388.  
  389. GLOBAL VOID init_av(VOID)
  390. {
  391.     WORD    i, d;
  392.     UBYTE    name[9], *p;
  393.  
  394.     if ((appl_xgetinfo(4, &d, &d, &i, &d)) && (i == 1))    /* gibts appl_search? */
  395.     {
  396.         if (appl_search(2, name, &d, &i) >= 1)
  397.             av_shell_id = i;
  398.     }
  399.     else
  400.     {
  401.         p = getenv("AVSERVER");
  402.         if (p != NULL)
  403.         {
  404.             strcpy(name, p);
  405.             for (i = (WORD)strlen(name); i < 8; i++)
  406.                 strcat(name, " ");
  407.             i = appl_find(name);
  408.             if (i >= 0)
  409.                 av_shell_id = i;
  410.         }
  411.     }
  412.     send_avprot();
  413. }
  414.  
  415. GLOBAL VOID term_av(VOID)
  416. {
  417.     send_avexit();
  418. }
  419.